import axios from "axios";
import router from "@/router";
import store from "@/store";


// import {Message} from "element-ui";

axios.defaults.baseURL = 'http://localhost:3000/admin/';
// axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';


// 在请求或响应被 then 或 catch 处理前拦截它们。

// 请求拦截 =>  请求发送前进行拦截 (准备发送请求 -> 先配置请求相关的信息(请求的方式  请求的地址 携带数据  请求头) => 发送请求)


axios.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么  => 携带token/自定义数据
    // console.log("请求发送前被拦截",config);
    var str = localStorage.getItem("userInfo");
    if(str){
        var data = JSON.parse(str);
        if(data.token){
            config.headers.token = data.token;
        }
    }
    
    
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });


// 响应拦截  => axios请求的响应部分 在被then和catch接受处理前拦截它们。
// 添加响应拦截器
// axios.interceptors.response.use(function (response) {
//     // 2xx 范围内的状态码都会触发该函数。 (status == 200  => 请求成功,后端返回结果)
//     // 对响应数据做点什么

//     console.log("响应被拦截",response);

//     return response.data; // status == 200 => 直接返回response.data接口返回的数据)
// }, function (error) {
//     // 超出 2xx 范围的状态码都会触发该函数。 (status == 100 300 400 500)
//     // 对响应错误做点什么
//     return Promise.reject(error);
// });

// status  请求的状态码,请求的结果
// status == 100 300 400 500  请求失败
// status == 200  请求成功,后端返回数据 (包含着增删改查的信息 code)  

// code   请求成功,对于的操作结果 前端向后端发送请求(实现数据的增删改查  => code 此过程中伴随的各种请求)
// code == 200 操作成功  => 登录成功/删除成功/修改成功/新增成功/查询成功
// code == 10003 操作失败 => 登录时密码有误
// code == 10005 操作失败 => token已经过期 => 需要重新登录

axios.interceptors.response.use(function (response) {
    // 2xx 范围内的状态码都会触发该函数。 (status == 200  => 请求成功,后端返回数据 (包含着增删改查的信息 code))
    // 对响应数据做点什么
    

    console.log("响应接收前被拦截",response);
    // console.log("router",router);

    var result = response.data;  // status == 200 => 直接返回response.data接口返回的响应数据( {code: 200/10003/10005})
    // code == 200 操作成功  => 登录成功/删除成功/修改成功/新增成功/查询成功
    // code == 10003 操作失败 => 登录是密码有误
    // code == 10005 操作失败 => token已经过期 => 需要重新登录

    var {code,message} = result;
    if(code == 200){ // status == 200(服务器返回响应) && code == '200'  操作成功的
        return result;    // 操作成功  原封不动返回数据
    }else if(code == 10003){ // status == 200(服务器返回响应) && code == '200'  操作成功的
        // return result;    // 操作成功  原封不动返回数据
        // var err = new Error(message);
        // return Promise.reject(err);  // 统一被catch处理
        // Message({
        //     message:message,
        //     type:"error",
        // })
        let err = new Error(message);
        return Promise.reject(err);  // 统一被catch处理
    }else if(code == 10119){ // token已经过期  => 去登录

        // 引入router实例
        // 1. router.push 通过路由实例进行跳转
        // 2. router.currentRoute  获取当前路由信息

        store.dispatch("exitAndUpdateAuthorityInfo");  // 清除vuex上的数据
        router.push({  // 去登录
            path:"/login",
            query:{
                ReturnUrl:router.currentRoute.fullPath,
            }
        })

        let err = new Error(message);  // token已经过期
        return Promise.reject(err);  // 统一被catch处理
    }else { // token已经过期  => 去登录
        let err = new Error(message);  // token已经过期
        return Promise.reject(err);  // 统一被catch处理
    }


    
}, function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。 (status == 100 300 400 500)
    // 对响应错误做点什么
    return Promise.reject(error);
});

export default axios;